﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
using System.Collections;
using System.Data.SqlClient;
namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsLogImportacionesDAO
    {

        private readonly AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();
        public bool Insertar(T_IMP_IMPORTACION_CAB Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("T_IMP_IMPORTACION_CAB", Obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }



        public bool InsertarBackOrder(T_IMP_IMPORTACION_CAB Obj)
        {

            ContextoDeObjs.AddObject("T_IMP_IMPORTACION_CAB", Obj);
            ContextoDeObjs.SaveChanges();

            return true;
        }


        public bool Modificar(T_IMP_IMPORTACION_CAB obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_IMP_IMPORTACION_CAB", obj);
                ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;

            }
            return true;
        }

        public bool InsertarDetalle(T_IMP_IMPORTACION_DET Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("T_IMP_IMPORTACION_DET", Obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public List<T_IMP_IMPORTACION_CAB> listar()
        {
            List<T_IMP_IMPORTACION_CAB> lista = new List<T_IMP_IMPORTACION_CAB>();
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_CAB
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
            }
            return lista;
        }

        public List<IMPORTACION_CAB> listar(int idCab)
        {
            List<IMPORTACION_CAB> lista = new List<IMPORTACION_CAB>();
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_CAB
                        select new IMPORTACION_CAB
                        {
                            ID_ORG_VTA = c.ID_ORG_VTA,
                            NUM_PEDIDO = c.NUM_PEDIDO,
                            NUM_PEDIDO_ORIG = c.NUM_PEDIDO_ORIG,
                            ID_OFI_VTA = c.ID_OFI_VTA,
                            FEC_PEDIDO = c.FEC_PEDIDO,
                            FEC_EMBARQUE_EST = c.FEC_EMBARQUE_EST,
                            FEC_EMBARQUE = c.FEC_EMBARQUE,
                            FEC_LLEG_PUERTO = c.FEC_LLEG_PUERTO,
                            FEC_LLEG_EST_PUERTO = c.FEC_LLEG_EST_PUERTO,
                            FEC_LLEG_ALMACEN = c.FEC_LLEG_ALMACEN,
                            COD_IMP_ESTADO = c.COD_IMP_ESTADO,
                            COD_VIA_TRANSPORTE = c.COD_VIA_TRANSPORTE,
                            OBSERVACION = c.OBSERVACION,
                            ID_PROVEEDOR = c.ID_PROVEEDOR,
                            FACTOR_IMP = c.FACTOR_IMP,
                            FEC_TITULO = c.FEC_TITULO,
                            FEC_POLIZA = c.FEC_POLIZA,
                            IND_SKD = c.IND_SKD,
                            NRO_PRONOSTICO = c.NRO_PRONOSTICO,
                            ID_TIPO_TRANSPORTE = c.ID_TIPO_TRANSPORTE,
                            CANT_CONTENEDOR_20_PIES = c.CANT_CONTENEDOR_20_PIES,
                            CANT_CONTENEDOR_40_PIES = c.CANT_CONTENEDOR_40_PIES,
                            ID_IMP_IMPORTACION_CAB = c.ID_IMP_IMPORTACION_CAB
                        };
                //if (strNumPedido != String.Empty) q = q.Where(f1 => f1.NUM_PEDIDO.ToUpper() == strNumPedido.ToUpper());
                if (!String.IsNullOrEmpty(idCab.ToString())) q = q.Where(f1 => f1.ID_IMP_IMPORTACION_CAB == idCab);

                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }

            return lista;
        }

        public bool Insertar2(T_IMP_IMPORTACION_CAB obj)
        {
            try
            {
                IMPORTACION_CAB ObjImpCab = new IMPORTACION_CAB();
                ObjImpCab.ID_ORG_VTA = obj.ID_ORG_VTA;
                ObjImpCab.NUM_PEDIDO = obj.NUM_PEDIDO;
                ObjImpCab.NUM_PEDIDO_ORIG = obj.NUM_PEDIDO_ORIG;
                ObjImpCab.ID_OFI_VTA = obj.ID_OFI_VTA;
                ObjImpCab.FEC_PEDIDO = obj.FEC_PEDIDO;
                ObjImpCab.FEC_EMBARQUE_EST = obj.FEC_EMBARQUE_EST;
                ObjImpCab.FEC_EMBARQUE = obj.FEC_EMBARQUE;
                ObjImpCab.FEC_LLEG_PUERTO = obj.FEC_LLEG_PUERTO;
                ObjImpCab.FEC_LLEG_EST_PUERTO = obj.FEC_LLEG_EST_PUERTO;
                ObjImpCab.FEC_LLEG_ALMACEN = obj.FEC_LLEG_ALMACEN;
                ObjImpCab.COD_IMP_ESTADO = obj.COD_IMP_ESTADO;
                ObjImpCab.COD_VIA_TRANSPORTE = obj.COD_VIA_TRANSPORTE;
                ObjImpCab.OBSERVACION = obj.OBSERVACION;
                ObjImpCab.ID_PROVEEDOR = obj.ID_PROVEEDOR;
                ObjImpCab.FACTOR_IMP = obj.FACTOR_IMP;
                ObjImpCab.FEC_TITULO = obj.FEC_TITULO;
                ObjImpCab.FEC_POLIZA = obj.FEC_POLIZA;
                ObjImpCab.IND_SKD = obj.IND_SKD;
                ObjImpCab.NRO_PRONOSTICO = obj.NRO_PRONOSTICO;
                String nroPronostico = (obj.NRO_PRONOSTICO == null) ? "null" : obj.NRO_PRONOSTICO.ToString();
                ObjImpCab.ID_TIPO_TRANSPORTE = obj.ID_TIPO_TRANSPORTE;

                String fhpedido, fhemb, fhembest, fhllegp, fhllegpest, fhllegal, fhtitulo, fhpoliza;
                fhpedido = (ObjImpCab.FEC_PEDIDO == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_PEDIDO);
                fhembest = (ObjImpCab.FEC_EMBARQUE_EST == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_EMBARQUE_EST);
                fhemb = (ObjImpCab.FEC_EMBARQUE == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_EMBARQUE);
                fhllegp = (ObjImpCab.FEC_LLEG_PUERTO == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_LLEG_PUERTO);
                fhllegpest = (ObjImpCab.FEC_LLEG_EST_PUERTO == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_LLEG_EST_PUERTO);
                fhllegal = (ObjImpCab.FEC_LLEG_ALMACEN == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_LLEG_ALMACEN);
                fhtitulo = (ObjImpCab.FEC_TITULO == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_TITULO);
                fhpoliza = (ObjImpCab.FEC_POLIZA == null) ? "null" : String.Format("{0:dd-MM-yyyy}", ObjImpCab.FEC_POLIZA);


                String sql = "INSERT INTO T_IMP_IMPORTACION_CAB ( ID_ORG_VTA,NUM_PEDIDO,NUM_PEDIDO_ORIG,ID_OFI_VTA,FEC_PEDIDO,FEC_EMBARQUE_EST,FEC_EMBARQUE,FEC_LLEG_PUERTO,FEC_LLEG_EST_PUERTO,FEC_LLEG_ALMACEN,COD_IMP_ESTADO,COD_VIA_TRANSPORTE ,OBSERVACION,ID_PROVEEDOR,FACTOR_IMP,FEC_TITULO,FEC_POLIZA,IND_SKD,NRO_PRONOSTICO,ID_TIPO_TRANSPORTE )    VALUES("
                    + ObjImpCab.ID_ORG_VTA + ","
                    + "'" + ObjImpCab.NUM_PEDIDO + "'" + ","
                    + "'" + ObjImpCab.NUM_PEDIDO_ORIG + "'" + ", "
                    + ObjImpCab.ID_OFI_VTA + ", "
                    + fhpedido + ", "
                    + fhembest + ", "
                    + fhemb + ", "
                    + fhllegp + ", "
                    + fhllegpest + ", "
                    + fhllegal + ", "
                    + "'" + ObjImpCab.COD_IMP_ESTADO + "'" + ","
                    + "'" + ObjImpCab.COD_VIA_TRANSPORTE + "'" + ", "
                    + "'" + ObjImpCab.OBSERVACION + "'" + ", "
                    + ObjImpCab.ID_PROVEEDOR + ", "
                    + ObjImpCab.FACTOR_IMP + ", "
                    + fhtitulo + ", "
                    + fhpoliza + ", "
                    + ObjImpCab.IND_SKD + ", "
                    + nroPronostico + ", "
                    + ObjImpCab.ID_TIPO_TRANSPORTE
                    + ")";

                //String sql = "INSERT INTO T_IMP_IMPORTACION_CAB(ID_ORG_VTA,NUM_PEDIDO,NUM_PEDIDO_ORIG,ID_OFI_VTA,FEC_PEDIDO,FEC_EMBARQUE_EST,FEC_EMBARQUE,FEC_LLEG_PUERTO,FEC_LLEG_EST_PUERTO,FEC_LLEG_ALMACEN,COD_IMP_ESTADO,COD_VIA_TRANSPORTE,OBSERVACION,ID_PROVEEDOR,FACTOR_IMP,NRO_POLIZA,NRO_TITULO,FEC_TITULO,FEC_POLIZA,IND_SKD,NRO_PRONOSTICO,ID_TIPO_TRANSPORTE,COD_SOLIC_PEDIDO,COD_PEDIDO_ABIERTO,COD_ORDEN_COMPRA,ID_STATUS,ID_CENTRO,BL,FEC_ACTUALIZACION) VALUES(" + ObjImpCab + ")";

                ContextoDeObjs.ExecuteStoreCommand(sql);

            }
            catch (Exception)
            {
                return false;
                throw;
            }
            return true;

        }

        public bool Modificar2(T_IMP_IMPORTACION_CAB obj)
        {
            try
            {
                var q = (from c in ContextoDeObjs.T_IMP_IMPORTACION_CAB
                         where c.ID_IMP_IMPORTACION_CAB == obj.ID_IMP_IMPORTACION_CAB //c.NUM_PEDIDO == obj.NUM_PEDIDO
                         select c).FirstOrDefault();


                q.ID_ORG_VTA = obj.ID_ORG_VTA;
                q.NUM_PEDIDO = obj.NUM_PEDIDO;
                q.NUM_PEDIDO_ORIG = obj.NUM_PEDIDO_ORIG;
                q.ID_OFI_VTA = obj.ID_OFI_VTA;
                q.FEC_PEDIDO = obj.FEC_PEDIDO;
                q.FEC_EMBARQUE_EST = obj.FEC_EMBARQUE_EST;
                q.FEC_EMBARQUE = obj.FEC_EMBARQUE;
                q.FEC_LLEG_PUERTO = obj.FEC_LLEG_PUERTO;
                q.FEC_LLEG_EST_PUERTO = obj.FEC_LLEG_EST_PUERTO;
                q.FEC_LLEG_ALMACEN = obj.FEC_LLEG_ALMACEN;
                q.COD_IMP_ESTADO = obj.COD_IMP_ESTADO;
                q.COD_VIA_TRANSPORTE = obj.COD_VIA_TRANSPORTE;
                q.OBSERVACION = obj.OBSERVACION;
                q.ID_PROVEEDOR = obj.ID_PROVEEDOR;
                q.FACTOR_IMP = obj.FACTOR_IMP;
                q.FEC_TITULO = obj.FEC_TITULO;
                q.FEC_POLIZA = obj.FEC_POLIZA;
                q.IND_SKD = obj.IND_SKD;
                q.NRO_PRONOSTICO = obj.NRO_PRONOSTICO;
                q.ID_TIPO_TRANSPORTE = obj.ID_TIPO_TRANSPORTE;
                q.CANT_CONTENEDOR_40_PIES = obj.CANT_CONTENEDOR_40_PIES;
                q.CANT_CONTENEDOR_20_PIES = obj.CANT_CONTENEDOR_20_PIES;
                ContextoDeObjs.SaveChanges();



                //ContextoDeObjs.AttachTo("T_IMP_IMPORTACION_CAB", ObjImpCab);
                //ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                //ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;

            }
            return true;
        }

        public int listarNumeroPedido(int idCab)
        {
            int num = 0;
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_CAB
                        where c.ID_IMP_IMPORTACION_CAB == idCab
                        //c.NUM_PEDIDO.ToUpper() == numpedido.ToUpper()
                        select c;
                num = q.Count();
            }
            catch (Exception)
            {
                num = 0;
            }
            return num;
        }

        public bool VerificarNumeroPedido(string numPedido)
        {
            int num = 0;
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_CAB
                        where c.NUM_PEDIDO==numPedido
                        select c;
                num = q.Count();
                if (num > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
            
        }

        //public bool ModificarCAB(string num_ped,DateTime fe_embarque,DateTime fe_embarque_Est,DateTime fe_Puerto,DateTime fe_Puerto_Est,string observ,string cod_imp_estado,int id_tipo_transporte,string num_pedido_orig)
        //{
        //    try
        //    {
        //        T_IMP_IMPORTACION_CAB li = ContextoDeObjs.T_IMP_IMPORTACION_CAB.First(i => i.NUM_PEDIDO == num_ped);
        //        li.FEC_EMBARQUE = fe_embarque;
        //        li.FEC_EMBARQUE_EST = fe_embarque_Est;
        //        li.FEC_LLEG_PUERTO = fe_Puerto;
        //        li.FEC_LLEG_EST_PUERTO = fe_Puerto_Est;
        //        li.OBSERVACION = observ;
        //        li.COD_IMP_ESTADO = cod_imp_estado;
        //        li.ID_TIPO_TRANSPORTE = id_tipo_transporte;
        //        li.NUM_PEDIDO_ORIG = num_pedido_orig;
        //        ContextoDeObjs.SaveChanges();
        //        return true;
        //    }
        //    catch (Exception)
        //    {
        //        return false;
        //    }

        //}

        public bool ModificaCab(string num_ped, string fe_embarque, string fe_embarque_Est, string fe_Puerto, string fe_Puerto_Est, string observ, string cod_imp_estado, int id_tipo_transporte, string num_pedido_orig)
        {
            try
            {
                ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_IMP_IMPORTACION_CAB SET FEC_EMBARQUE_EST ={0},FEC_EMBARQUE = {1},FEC_LLEG_PUERTO ={2},FEC_LLEG_EST_PUERTO ={3},COD_IMP_ESTADO = '{4}',OBSERVACION = '{5}',ID_TIPO_TRANSPORTE ={6},NUM_PEDIDO_ORIG ='{7}' WHERE NUM_PEDIDO='{8}'", (fe_embarque_Est == "" ? "NULL" : "'" + Convert.ToDateTime(fe_embarque_Est).ToString("yyyy/MM/dd") + "'"), (fe_embarque == "" ? "NULL" : "'" + Convert.ToDateTime(fe_embarque).ToString("yyyy/MM/dd") + "'"), (fe_Puerto == "" ? "NULL" : "'" + Convert.ToDateTime(fe_Puerto).ToString("yyyy/MM/dd") + "'"), (fe_Puerto_Est == "" ? "NULL" : "'" + Convert.ToDateTime(fe_Puerto_Est).ToString("yyyy/MM/dd") + "'"), cod_imp_estado, observ, id_tipo_transporte, num_pedido_orig, num_ped));
                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool Anular_importacion(int idCab)
        {
            try
            {
                ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_IMP_IMPORTACION_CAB SET NUM_PEDIDO=ID_IMP_IMPORTACION_CAB,COD_IMP_ESTADO='07' FROM T_IMP_IMPORTACION_CAB tiic WHERE tiic.ID_IMP_IMPORTACION_CAB={0}",idCab));
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public IEnumerable<Object> ImportacionCAB(int Anio_ini, int anio_fin, string indicador, int od_org_vta)
        {
            IEnumerable<Object> lista = new List<Object>();

            var q = from c in ContextoDeObjs.USP_LOG_IMPORTACIONES_CAB(Anio_ini, anio_fin, indicador, od_org_vta)
                    select c;
            lista = q.ToList();

            return lista;
        }

        public IEnumerable<Object> ImportacionCAB(int Anio_ini, int anio_fin, string indicador, int od_org_vta, String strNumPedido)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from c in ContextoDeObjs.USP_LOG_IMPORTACIONES_CAB(Anio_ini, anio_fin, indicador, od_org_vta)
                        select c;
                if (strNumPedido != String.Empty) q = q.Where(f1 => f1.NUM_PEDIDO.ToUpper().Contains(strNumPedido));
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }

            return lista;
        }

        public int RetorFunctionNumMes(string ini, string fin)
        {
            var queryText = "select [dbo].[FU_GET_NRO_MESES] ('" + ini + "','" + fin + "')";
            var lisr = ContextoDeObjs.ExecuteStoreQuery<int>(queryText).ToList();
            return lisr.FirstOrDefault();
        }

        public IEnumerable<Object> ListaTipoTranspote()
        {
            IEnumerable<Object> list = new List<Object>();
            try
            {
                var q = from c in ContextoDeObjs.T_MAE_TABLA_GENERAL_CAB
                        from d in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET
                        where c.ID_GENERAL_CAB == d.ID_GENERAL_CAB
                        && c.NOM_TABLA == "T_IMP_TRANSPORTE_TIPO"
                        select new
                        {
                            d.ID_GENERAL_DET,
                            d.ID_GENERAL_CAB,
                            d.DES_CORTA,
                            d.DES_LARGA
                        };
                list = q.ToList();
            }
            catch
            {
                list = null;
            }
            return list;
        }

        public int UltimoPedidoGenerado()
        {
            try
            {
                var queryText = String.Format("declare @id_cabecera int SELECT @id_cabecera=IDENT_CURRENT ('T_IMP_IMPORTACION_CAB') select @id_cabecera");
                var lisr = ContextoDeObjs.ExecuteStoreQuery<int>(queryText).ToList();
                return lisr.FirstOrDefault();
            }
            catch (Exception)
            {
                return 0;
            }
        }



        public List<T_IMP_IMPORTACION_DET> ListaBackOder(String num_pedido)
        {

            List<T_IMP_IMPORTACION_DET> list = new List<T_IMP_IMPORTACION_DET>();
            try
            {
                var queryText = String.Format("SELECT tiic.NUM_PEDIDO,tiic.NUM_PEDIDO_ORIG,tiid.COD_MATERIAL,tiid.DES_MATERIAL_IMP,CANT_IMP=(tiid.CANT_IMP),FOB_ME=SUM(tiid.FOB_ME),TOTAL_FOB_ME=sum(tiid.TOTAL_FOB_ME)FROM T_IMP_IMPORTACION_CAB tiic INNER JOIN T_IMP_IMPORTACION_DET tiid ON tiid.NUM_PEDIDO=tiic.NUM_PEDIDO WHERE tiic.NUM_PEDIDO_ORIG='{0}' AND tiid.COD_TIPO_PEDIDO='cot' AND TIID.COD_TIPO_PEDIDO!='SUG' GROUP BY tiic.NUM_PEDIDO,tiic.NUM_PEDIDO_ORIG,tiid.COD_MATERIAL,tiid.DES_MATERIAL_IMP,tiid.CANT_IMP ", num_pedido);
                var l = ContextoDeObjs.ExecuteStoreQuery<T_IMP_IMPORTACION_DET>(queryText);
                list = l.ToList();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return list;

        }



        public List<T_IMP_IMPORTACION_DET> ListBackOrderxMaterial(String num_pedido, String cod_tipo_pedido, int id_material)
        {

            List<T_IMP_IMPORTACION_DET> list = new List<T_IMP_IMPORTACION_DET>();
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_DET
                        where c.NUM_PEDIDO == num_pedido && c.COD_TIPO_PEDIDO == cod_tipo_pedido
                        && c.ID_MATERIAL == id_material
                        select c;

                list = q.ToList();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return list;

        }




        public bool GeneraBackOrder(String num_pedido_org)
        {

            try
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("exec USP_GENERA_BACK_ORDER @NUM_PEDIDO_ORIG={0}", num_pedido_org);
                return true;
            }
            catch (SqlException sqlex)
            {
                throw sqlex;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

    }
}
